@file:Suppress("MemberVisibilityCanBePrivate", "unused")

package com.virtualightning.mvvm.tools.shapes

import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/12/14 16:56
 *  矩形
 */
class VLRect(
	/**
	 * 左边距
	 */
	var left: Float = 0f,
	/**
	 * 上边距
	 */
	var top: Float = 0f,
	/**
	 * 右边距
	 */
	var right: Float = 0f,
	/**
	 * 下边距
	 */
	var bottom: Float = 0f,
	/**
	 * 圆角
	 */
	var radius: Float = 0f
): BaseShape() {

	override fun toString(): String = "VLRect(left: $left, top: $top, right: $right, bottom: $bottom)"



	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/12/14 5:24 下午 by CimZzz
	// 以下内容为:
	// 父类实现方法
	///////////////////////////////////////////////////////////////////////////
	/**
	 * X 轴偏移
	 * @param dx Float X 轴偏移量
	 */
	override fun onOffsetX(dx: Float) {
		set(left + dx, top, right + dx, bottom)
	}

	/**
	 * Y 轴偏移
	 * @param dy Float Y 轴偏移量
	 */
	override fun onOffsetY(dy: Float) {
		set(left, top + dy, right, bottom + dy)
	}

	/**
	 * 移动 X 轴至指定位置
	 * @param x Float X 坐标
	 */
	override fun onMoveX(x: Float) {
		offsetX(x - left)
	}

	/**
	 * 移动 Y 轴至指定位置
	 * @param y Float Y 坐标
	 */
	override fun onMoveY(y: Float) {
		offsetY(y - top)
	}

	/**
	 * 绘制用辅助矩形
	 */
	private val helperRectF by lazy { RectF() }

	/**
	 * 绘制矩形
	 * @param canvas Canvas 画布
	 * @param paint Paint 画笔
	 */
	override fun onDraw(canvas: Canvas, paint: Paint) {
		if(radius != 0f) {
			canvas.drawRoundRect(helperRectF, radius, radius, paint)
		} else {
			canvas.drawRect(left, top, right, bottom, paint)
		}
	}

	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/12/14 5:24 下午 by CimZzz
	// 以下内容为:
	// 尺寸相关方法
	///////////////////////////////////////////////////////////////////////////

	/**
	 * 重置矩形
	 */
	fun reset() {
		left = 0f
		top = 0f
		right = 0f
		bottom = 0f
	}

	/**
	 * 设置矩形边距
	 * @param left Float 左边距
	 * @param top Float 上边距
	 * @param right Float 右边距
	 * @param bottom Float 下边距
	 */
	fun set(left: Float, top: Float, right: Float, bottom: Float) {
		this.left = left
		this.top = top
		this.right = right
		this.bottom = bottom
	}

	/**
	 * 设置矩形边距
	 * @param rect Rect 参照矩形
	 */
	fun set(rect: VLRect) {
		set(rect.left, rect.top, rect.right, rect.bottom)
	}

	/**
	 * 设置矩形边距，根据尺寸自动设置右边距和下边距
	 * @param left Float 左边距
	 * @param top Float 右边距
	 * @param size VLSize 尺寸对象
	 */
	fun set(left: Float, top: Float, size: VLSize) {
		set(left, top, size.width + left, size.height + top)
	}

	/**
	 * 设置矩形边距，根据尺寸放置在左上角，自动设置右边距和下边距
	 * @param size VLSize 尺寸对象
	 */
	fun set(size: VLSize) {
		set(left, top, size.width + left, size.height + top)
	}

	/**
	 * 在指定矩形内居中并且撑满
	 * @param rect VLRect 指定矩形
	 */
	fun fillCenterIn(rect: VLRect) {
		val width = rect.width()
		val height = rect.height()
	}

	/**
	 * 判断坐标点是否在矩形内
	 * @param x Float X 坐标
	 * @param y Float Y 坐标
	 * @return Boolean 如果存在返回 true
	 */
	fun contain(x: Float, y: Float): Boolean {
		return x in left..right && y in top..bottom
	}

	/**
	 * 判断坐标点是否在矩形内
	 * @param point VLPoint 坐标点
	 * @return Boolean 如果存在返回 true
	 */
	fun contain(point: VLPoint): Boolean {
		return contain(point.x, point.y)
	}

	/**
	 * X 点在矩形内水平方向的占比
	 * @param x Float Y 点
	 * @return Float 占比，如果不在矩形中返回 -1f
	 */
	fun horRatio(x: Float): Float {
		return (x - left) / (right - left)
	}

	/**
	 * Y 点在矩形内垂直方向的占比
	 * @param y Float Y 点
	 * @return Float 占比，如果不在矩形中返回 -1f
	 */
	fun verRatio(y: Float): Float {
		return (y - top) / (bottom - top)
	}

	/**
	 * 返回矩阵宽度
	 * @return Float 矩阵的宽
	 */
	fun width(): Float {
		return right - left
	}

	/**
	 * 返回矩阵高度
	 * @return Float 矩阵的高
	 */
	fun height(): Float {
		return bottom - top
	}

	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/12/14 5:24 下午 by CimZzz
	// 以下内容为:
	// 特殊查询相关方法
	///////////////////////////////////////////////////////////////////////////

	/**
	 * 计算左边距界值
	 * @param limitMinValue Float? 最小边界值
	 * @param limitMaxValue Float? 最大边界值
	 * @return Float 计算后的边距界值
	 */
	fun leftBound(limitMinValue: Float? = null, limitMaxValue: Float? = null): Float {
		return calcBoundValue(left, limitMinValue, limitMaxValue)
	}


	/**
	 * 计算上边距界值
	 * @param limitMinValue Float? 最小边界值
	 * @param limitMaxValue Float? 最大边界值
	 * @return Float 计算后的边距界值
	 */
	fun topBound(limitMinValue: Float? = null, limitMaxValue: Float? = null): Float {
		return calcBoundValue(top, limitMinValue, limitMaxValue)
	}


	/**
	 * 计算右边距界值
	 * @param limitMinValue Float? 最小边界值
	 * @param limitMaxValue Float? 最大边界值
	 * @return Float 计算后的边距界值
	 */
	fun rightBound(limitMinValue: Float? = null, limitMaxValue: Float? = null): Float {
		return calcBoundValue(right, limitMinValue, limitMaxValue)
	}


	/**
	 * 计算下边距界值
	 * @param limitMinValue Float? 最小边界值
	 * @param limitMaxValue Float? 最大边界值
	 * @return Float 计算后的边距界值
	 */
	fun bottomBound(limitMinValue: Float? = null, limitMaxValue: Float? = null): Float {
		return calcBoundValue(bottom, limitMinValue, limitMaxValue)
	}

	/**
	 * 内部计算边距边界值
	 * @param srcValue Float 边距界值
	 * @param limitMinValue Float? 最小边界值
	 * @param limitMaxValue Float? 最大边界值
	 * @return Float 计算后的边距界值
	 */
	private fun calcBoundValue(srcValue: Float, limitMinValue: Float? = null, limitMaxValue: Float? = null): Float {
		return when {
			limitMaxValue == null && limitMinValue == null -> 0f
			limitMaxValue != null && srcValue > limitMaxValue -> limitMaxValue - srcValue
			limitMinValue != null && srcValue < limitMinValue -> limitMinValue - srcValue
			else -> 0f
		}
	}
}